package com.seka.control.service;

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

import javax.annotation.PostConstruct;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.seka.control.common.SekaContants;
import com.seka.control.common.SekaPropDto;
import com.seka.control.dto.SekaDto;
import com.seka.control.dto.SekaResponse;
import com.seka.control.utils.HttpGetUtil;
import com.seka.control.utils.JsonUtil;
import com.seka.control.utils.SetUtil;

/**
 * 服务管理
 * @author mw
 *
 */
@Component
public class ServiceManager {
	/**
	 * 日志
	 */
	private static final Logger LOG = LoggerFactory.getLogger(ServiceManager.class);
	
	/**
	 * 服务配置信息
	 */
	@Autowired
	SekaPropDto sekaPropDto;
	/**
	 * 服务注册地址集合
	 */
	private Set<String> servicesUrlSet;

	/**
	 * 任务管理中心
	 */
	@Autowired
	ScheduledManager scheduledManager;
	
	@Autowired
	SekaControl sekaControl;
	
	/**
	 * 检查服务
	 */
	public boolean check() {
		boolean monitorFlag = monitor();//服务检测
		try {
			if(!monitorFlag) {
				return monitorFlag ;
			}
			boolean openFlag = scheduledManager.open();
			if(openFlag) {
				//设置服务状态
				sekaControl.setStatus(SekaContants.RUN_OPEN);
				//关闭心跳
				sekaControl.stop();
			}
		} catch (Exception e) {
			LOG.error("定时开启失败：",e); 
		}
		return monitorFlag;
	}
	
	/**
	 * 服务检查
	 * @return
	 */
	private boolean monitor() {
		boolean monitorFlag = false;
		if(servicesUrlSet.isEmpty()) {
			return monitorFlag;
		}
		Set<Boolean> b = new HashSet<>();
		for (String url : servicesUrlSet) {
			Boolean mFlag = get(url);
			b.add(mFlag);
		}
		if(b.size()>1) {
			if(b.contains(Boolean.FALSE)) {
				return false;
			}
		}else {
			if(b.contains(Boolean.TRUE)) {
				monitorFlag = true;
			}
		}
		return monitorFlag;
	}

	/**
	 * 发送请求
	 * @param url
	 * @return
	 */
	private boolean get(String url) {
		try {
			String resJson = HttpGetUtil.get(url);
			SekaResponse res = JsonUtil.parseObject(resJson,SekaResponse.class);
			if(res.isSuccess()) {
				Object o = res.getData();
				SekaDto dto =null;
				if(o instanceof JSON) {
					dto = JsonUtil.toJavaObject((JSON)o, SekaDto.class);
				}else {
					dto = JsonUtil.parseObject(JSONObject.toJSONString(o), SekaDto.class);
				}
				if(dto !=null) {
					LOG.info("服务检测：{}，服务状态:{}",url,dto.getStatus());
					switch (dto.getStatus()) {
					case SekaContants.RUN_DO:
						return true;
					case SekaContants.RUN_OPEN:
						return false;
					default:
						break;
					}
				}
			}
		} catch (IOException e) {
			LOG.error("服务检测：{}，服务状态:{}",url,SekaContants.RUN_DOWN);
		}
		return true;
	}

	/**
	 * 初始化数据
	 */
	@PostConstruct
	public void init() {
		if(servicesUrlSet ==null) {
			servicesUrlSet = new HashSet<>();
		}
		if(sekaPropDto.getRegisterUrl() ==null && "".equals(sekaPropDto.getRegisterUrl())) {
			return ;
		}
		if(sekaPropDto.getRegisterUrl().contains(",")) {
			String[] sp = sekaPropDto.getRegisterUrl().split(",");
			SetUtil.arrToSet(sp, servicesUrlSet);
		}else {
			servicesUrlSet.add(sekaPropDto.getRegisterUrl());
		}
	}
}
